/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package suministros.ejb30.DAO;

import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.sql.DataSource;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import suministros.ejb30.TO.AsistenciaTO;
import suministros.ejb30.entity.Asistencia;
import suministros.ejb30.entity.AuxiliarCargarAsistenciaDiaria;
import suministros.ejb30.entity.Parametros;

/**
 *
 * @author Administrador
 */
@Stateless
public class RRHHGestionAsistenciasDAO implements RRHHGestionAsistenciasDAOLocal {

    @PersistenceUnit(unitName="suministros-pu")
     EntityManagerFactory emf;

    EntityManager em;


    @Resource(name="jdbc/Administracion")
    DataSource dsAdministracion;

     @PostConstruct
      public void inicializaBean()
      {
        this.em = this.emf.createEntityManager();
      }

    @PreDestroy
      public void finalizaBean() {
        this.em.close();
      }
    
    public List<Asistencia> getAsistenciaDiaria(String fecha,int area) throws Exception {
        List<Asistencia> asistencias = new ArrayList(1);
        Query q = this.em.createNamedQuery("Asistencia.findByFechaAndArea");
        q.setParameter("fecha",fecha);
        q.setParameter("area",area);
        asistencias = q.getResultList();
        System.out.println("<<>>"+asistencias.size());
        if(asistencias.size()==0){
             q = this.em.createNativeQuery("select tr.DNI,p.ap_paterno+' '+p.ap_materno+', '+p.nombre from trabajador tr inner join persona p "+
                                                "on tr.DNI = p.codigo_persona where tr.cod_estado='01' and tr.cod_area="+area + " and tr.id_tipo_trab=2 and tr.cod_estado<>'05'");
             List temp = q.getResultList();
             Parametros param = getParametroporId("1");

               for (Iterator i$ = temp.iterator(); i$.hasNext(); )
                {
                  Object obj = i$.next();
                  Object[] array = ((List)obj).toArray();
                  Asistencia asistencia = new Asistencia( array[0].toString(),fecha);
                  asistencia.setNombres(array[1].toString());
                  asistencia.setDominical(false);
                  asistencia.setHorasExtra25(BigDecimal.ZERO);
                  asistencia.setHorasExtra35(BigDecimal.ZERO);
                  asistencia.setHorasNocturnas(BigDecimal.ZERO);
                  asistencia.setHorasOrdinarias(BigDecimal.ZERO);
                  asistencia.setObser("");
                  asistencia.setAnio(param.getParam1());
                  asistencia.setMes(param.getParam2());
                  asistencia.setCodArea(area);
                  asistencias.add(asistencia);
                    System.out.println("<<"+asistencia.getCodArea());
                }  
        }
       
        return asistencias;
    }

    public boolean insertaAsistencias(List<Asistencia> asistencias,Integer area) throws Exception {
        /*boolean retorno = false;

        EntityTransaction tx = this.em.getTransaction();
        tx.begin();

         try {
                for (Asistencia asistencia : asistencias) {
                    Asistencia asistencia_persistida= this.em.find(Asistencia.class, asistencia.getAsistenciaPK());
                    if(asistencia_persistida == null)   
                            this.em.persist(asistencia);
                    else{
                        asistencia_persistida.setDominical(asistencia.getDominical());
                        asistencia_persistida.setHorasExtra25(asistencia.getHorasExtra25());
                        asistencia_persistida.setHorasExtra35(asistencia.getHorasExtra35());
                        asistencia_persistida.setHorasNocturnas(asistencia.getHorasNocturnas());
                        asistencia_persistida.setHorasOrdinarias(asistencia.getHorasOrdinarias());
                        this.em.merge(asistencia_persistida);
                    }
                }
                this.em.flush();
                tx.commit();
                retorno=true;
          } catch (Exception e) {
                  tx.rollback();
                  throw e;
            }
        return retorno;
        */

        boolean retorno = false;

        EntityTransaction tx = this.em.getTransaction();
        tx.begin();

         try {
                 String fecha =  asistencias.get(0).getAsistenciaPK().getFecha();
                
                 System.out.println("area"+area);
                Query q = this.em.createNamedQuery("Asistencia.findByFechaAndArea");
                q.setParameter("fecha",fecha);
                q.setParameter("area",area);
                List<Asistencia> asistencias_persistidas = q.getResultList();
               /* for (Asistencia asistencia : asistencias_persistidas) {
                    asistencia.setCodArea(area);
                    this.em.remove(asistencia);
                }
                this.em.flush();*/

                for (Asistencia asistencia : asistencias) {
                    asistencia.setCodArea(area);
                    this.em.merge(asistencia);
                }

                this.em.flush();
                tx.commit();
                retorno=true;
          } catch (Exception e) {
                  tx.rollback();
                  throw e;
            }
        return retorno;


    }

   public Parametros getParametroporId(String idParam) throws Exception {
        Query consulta = this.em.createNamedQuery("Parametros.findByIdParametro");
        consulta.setParameter("idParametro", idParam);
        return (Parametros)consulta.getSingleResult();
  }

 public List<AuxiliarCargarAsistenciaDiaria> insertarAsistenciaMigracion(List<AuxiliarCargarAsistenciaDiaria> listaAsistencia) throws Exception {       
        List<AuxiliarCargarAsistenciaDiaria> listaRetorno=new ArrayList(1);
        EntityTransaction tx = this.em.getTransaction();
        tx.begin();
        try{
            Query q1 = this.em.createNativeQuery("delete from auxiliar_cargar_asistencia_diaria");
            q1.executeUpdate();
            for(AuxiliarCargarAsistenciaDiaria auxiliar:listaAsistencia){
                try{
                    Query q = this.em.createNativeQuery("INSERT INTO auxiliar_cargar_asistencia_diaria " +
                        " (DNI,FECHA,HORA_ENTRADA,HORA_SALIDA,FERIADO,DOMINGO,h_ordinarias,h_nocturnas) " +
                        " VALUES (?,?,?,?,?,?,?,?) ");
                    q.setParameter(1, auxiliar.getAuxiliarCargarAsistenciaDiariaPK().getDni().trim());
                    q.setParameter(2, auxiliar.getAuxiliarCargarAsistenciaDiariaPK().getFecha().trim());
                    q.setParameter(3, auxiliar.getHoraEntrada().trim());
                    q.setParameter(4, auxiliar.getHoraSalida().trim());
                    q.setParameter(5, auxiliar.getFeriado());
                    q.setParameter(6, auxiliar.getDomingo());
                    q.setParameter(7, auxiliar.getH_ordinaria());
                    q.setParameter(8, auxiliar.getH_nocturna());
                    q.executeUpdate();
                    
                }catch(Exception e){
                    auxiliar.setMensajeError(e.getMessage());
                    listaRetorno.add(auxiliar);
                }
            }
            Query q = this.em.createNativeQuery("SELECT DNI, FECHA, HORA_ENTRADA, HORA_SALIDA, FERIADO," +
                    " DOMINGO FROM auxiliar_cargar_asistencia_diaria " +
                    " where dni not in (select dni from trabajador)");

            List temp = q.getResultList();
                   for (Iterator i$ = temp.iterator(); i$.hasNext(); )
                    {
                      Object obj = i$.next();
                      Object[] array = ((List)obj).toArray();
                      AuxiliarCargarAsistenciaDiaria asistencia = new AuxiliarCargarAsistenciaDiaria( array[0].toString(),array[1].toString());
                      asistencia.setHoraEntrada(array[2].toString());
                      asistencia.setHoraSalida(array[3].toString());
                      asistencia.setMensajeError("Trabajador no existe!");
                      listaRetorno.add(asistencia);
                }
            tx.commit();
        }catch(Exception e){
            tx.rollback();
            System.out.println("erro> "+e.getMessage());
            throw e;
        }
         finally{
           
            return listaRetorno;
        }
            
    }

    public List<AsistenciaTO> getAsistenciaEntreFechas(String fInicio, String fFin) throws Exception {
        List<AsistenciaTO> retorno=new ArrayList(1);
        Query q = this.em.createNativeQuery("SELECT DNI," +
                " isnull((SELECT Ap_paterno + ' ' + Ap_materno + ' , ' + Nombre AS Expr1 " +
                " FROM  Persona WHERE (codigo_persona = asistencia.DNI)),'-') AS nombres, " +
                " isnull((select nom_area from area_empresa where cod_area= " +
                " (select cod_area from trabajador where dni=asistencia.dni)),'-') as area, " +
                " isnull(fecha,'-'), isnull(hora_entrada,'-') as hentrada, isnull(hora_salida,'-') as hsalida, " +
                " isnull(horas_ordinarias,0.00), isnull(horas_nocturnas,0.00),  " +
                " isnull(horas_extra_25,0.00), isnull(horas_extra_35,0.00), " +
                " CASE dominical WHEN 1 then 'SI' else 'NO' end AS DOMINICAL, " +
                " CASE feriado WHEN 1 then 'SI' else 'NO' end AS FERIADO " +
                " FROM asistencia " +
                " where convert(datetime,fecha,103) between convert(datetime,'"+fInicio+"',103) and " +
                " convert(datetime,'"+fFin+"',103) " +
                " order by area,nombres,fecha");


             List temp = q.getResultList();


               for (Iterator i$ = temp.iterator(); i$.hasNext(); )
                {
                  Object obj = i$.next();
                  Object[] array = ((List)obj).toArray();
                  AsistenciaTO asistencia = new AsistenciaTO( );
                  asistencia.setDni(array[0].toString());
                  asistencia.setNombre(array[1].toString());
                  asistencia.setArea(array[2].toString());
                  asistencia.setFecha(array[3].toString());
                  asistencia.setHentrada(array[4].toString());
                  asistencia.setHsalida(array[5].toString());
                  asistencia.setHordinaria(new BigDecimal(new Double(array[6].toString())));
                  asistencia.setHnocturna(new BigDecimal(new Double(array[7].toString())));
                  asistencia.setHextra25(new BigDecimal(new Double(array[8].toString())));
                  asistencia.setHextra35(new BigDecimal(new Double(array[9].toString())));
                  asistencia.setDomingo(array[10].toString());
                  asistencia.setFeriado(array[11].toString());
                  retorno.add(asistencia);

                }

        return retorno;
    }

    public void procesarAsistenciasMigradas() throws Exception {

        Connection cnx = null;
        String error="error",mensaje="no pudo llamarse al procedimiento sp_procesaMigracionAsistencia";
        try {
          //Utiles_Fecha fecha = new Utiles_Fecha(orden.getFechaemision());
          cnx = this.dsAdministracion.getConnection();
          CallableStatement csLlamada = cnx.prepareCall("{call sp_procesaMigracionAsistencia(?,?)}");
          csLlamada.registerOutParameter(1,Types.VARCHAR);
          csLlamada.registerOutParameter(2,Types.VARCHAR);
          csLlamada.execute();

          error = csLlamada.getString(1);
          mensaje=csLlamada.getString(2);
        }
        catch (SQLException ex) {
          throw ex;
        } finally {
          try {
            cnx.close();
          } catch (Exception ex) {;
          }
          if(!error.trim().equalsIgnoreCase("bien"))
              throw new Exception (error+"\n"+mensaje);
        }
    }


 
}
